package com.wetao.lib_common.base;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.Application;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatDelegate;

import com.kongzue.dialogx.DialogX;
import com.kongzue.dialogx.dialogs.CustomDialog;
import com.kongzue.dialogx.style.MaterialStyle;
import com.orhanobut.logger.Logger;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshInitializer;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.smtt.export.external.TbsCoreSettings;
import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.TbsListener;
import com.wetao.lib_common.EventBus.EventBusMessage;
import com.wetao.lib_common.R;
import com.wetao.lib_common.exception.CrashHandler;
import com.wetao.lib_common.greendao.DBUtils;
import com.wetao.lib_common.net.ServerUtils;
import com.wetao.lib_common.net.cookies.CookiesManager;
import com.wetao.lib_common.net.cookies.PersistentCookieStore;
import com.wetao.lib_common.utils.ConstantUtils;
import com.wetao.lib_common.utils.DynamicTimeFormat;
import com.wetao.lib_common.utils.LogUtils;
import com.wetao.lib_common.utils.PreferenceTool;
import com.wetao.lib_common.utils.SPUtils;
import com.wetao.lib_common.utils.ToastUtil;
import com.wetao.lib_common.utils.oss.UploadOss;
import com.wetao.lib_common.view.dialogtiplib.util.AppUtils;

import org.greenrobot.eventbus.EventBus;
import org.scilab.forge.jlatexmath.core.AjLatexMath;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import io.github.kbiakov.codeview.classifier.CodeProcessor;


public class BaseAppDeletage {

    private Application mApplication;
    //private RefWatcher refWatcher;
    public static  boolean isRunInBackground = false;
    private int appCount = 0;

    public BaseAppDeletage(Application application) {
        mApplication = application;
    }

    public void onCreate() {

        ConstantUtils.init(mApplication);     //全局Utils

        PersistentCookieStore.init(mApplication);

        AppUtils.init(mApplication); //加载框，提示框

        LogUtils.setLogEnable(ConstantUtils.isAppDebug());  //Log日志
        LogUtils.setLogEnablePrint(false);  //Log日志是否打印文本
        PreferenceTool.init(mApplication);   //Preference参数
        SPUtils.init(mApplication);
        ToastUtil.init(mApplication);       //吐司初始化
        UploadOss.init(mApplication);
        ServerUtils.init(mApplication);

        CodeProcessor.init(mApplication);
        AjLatexMath.init(mApplication); //公式解析相关

        // 在调用TBS初始化、创建WebView之前进行如下配置
        HashMap map = new HashMap();
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
        QbSdk.initTbsSettings(map);

        QbSdk.setDownloadWithoutWifi(true);



        //不要打开，已经用了腾讯的，CrashHandler.getInstance().init(mApplication);

        CrashReport.UserStrategy userStrategy = new CrashReport.UserStrategy(mApplication);
        userStrategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {

            public Map<String, String> onCrashHandleStart(int crashType, String errorType,
                                                          String errorMessage, String errorStack) {
                LogUtils.i("报错打印 onCrashHandleStart");
                //清除所有Cookies缓存内容
                CookiesManager.clearAllCookies();

                LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
                map.put(errorMessage, errorStack);

                StringBuffer sb = new StringBuffer();
                sb.append("==================================================\r\n");
                sb.append(crashType + "\r\n");
                sb.append(errorType + "\r\n");
                sb.append(errorMessage + "\r\n");
                sb.append(errorStack + "\r\n");
                CrashHandler.saveErrToFile(sb);

                EventBus.getDefault().post(new EventBusMessage(EventBusMessage.EVENT_BUS_ACTION_ERROR, null));
                //reStartApp();
                //System.exit(1);
                return map;
            }

            @Override
            public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType,
                                                           String errorMessage, String errorStack) {
                LogUtils.i("报错打印 onCrashHandleStart2GetExtraDatas");
                try {
                    return "Extra data.".getBytes("UTF-8");
                } catch (Exception e) {
                    return null;
                }
            }

        });
        CrashReport.initCrashReport(mApplication, userStrategy); //bugly异常上报

        //initLeakCanary();
        initSmartRefreshLayout();

        initDialogX();

        //DBUtils.getInstance(mApplication).getDaoSession(); //数据库升级

        /**
         * 富文本数据库初始化
         */
        //DaoManager.init(mApplication);

        initBackgroundCallBack();

    }

    private void reStartApp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Intent intent = new Intent();
                intent.setClassName("com.sunducation.wts.penbox.activity","com.sunducation.wts.penbox.activity.SplashActivity");
                @SuppressLint("WrongConstant")
                PendingIntent restartIntent = PendingIntent.getActivity(
                        mApplication, 0, intent,
                        Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                //退出程序
                AlarmManager mgr = (AlarmManager)mApplication.getSystemService(Context.ALARM_SERVICE);
                mgr.set(AlarmManager.RTC, System.currentTimeMillis(),
                        restartIntent); //1秒钟后重启应用
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(0);
            }
        }).start();

    }
    private void initSmartRefreshLayout() {
        //启用矢量图兼容
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        //设置全局默认配置（优先级最低，会被其他设置覆盖）
        SmartRefreshLayout.setDefaultRefreshInitializer(new DefaultRefreshInitializer() {
            @Override
            public void initialize( Context context,  RefreshLayout layout) {
                //全局设置（优先级最低）
                layout.setEnableAutoLoadMore(true);
                layout.setEnableOverScrollDrag(false);
                layout.setEnableOverScrollBounce(true);
                layout.setEnableLoadMoreWhenContentNotFull(true);
                layout.setEnableScrollContentWhenRefreshed(true);
            }
        });
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {

            @Override
            public RefreshHeader createRefreshHeader( Context context,  RefreshLayout layout) {
                //全局设置主题颜色（优先级第二低，可以覆盖 DefaultRefreshInitializer 的配置，与下面的ClassicsHeader绑定）
                layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);

                return new ClassicsHeader(context).setTimeFormat(new DynamicTimeFormat("更新于 %s"));
            }
        });
    }

    /*public static RefWatcher getRefWatcher(Context context){
        BaseApplication application = (BaseApplication)context.getApplicationContext();
        return application.refWatcher;
    }*/

    private void initDialogX() {
        DialogX.init(mApplication);

        //开启调试模式，在部分情况下会使用 Log 输出日志信息
        DialogX.DEBUGMODE = true;

        //设置主题样式
        DialogX.globalStyle = MaterialStyle.style();

        //设置亮色/暗色（在启动下一个对话框时生效）
        DialogX.globalTheme = DialogX.THEME.LIGHT;

        //设置对话框最大宽度（单位为像素）
        //DialogX.dialogMaxWidth = 1920;

        //设置 InputDialog 自动弹出键盘
        //DialogX.autoShowInputKeyboard = true;

        //限制 PopTip 一次只显示一个实例（关闭后可以同时弹出多个 PopTip）
        DialogX.onlyOnePopTip = false;

        //设置对话框默认按钮文本字体样式
        //DialogX.buttonTextInfo = (TextInfo);

        //设置对话框默认确定按钮文字样式
        //DialogX.okButtonTextInfo = (TextInfo);

        //设置对话框默认标题文字样式
        //DialogX.titleTextInfo = (TextInfo);

        //设置对话框默认内容文字样式
        //DialogX.messageTextInfo = (TextInfo);

        //设置默认 WaitDialog 和 TipDialog 文字样式
        //DialogX.tipTextInfo = (TextInfo);

        //设置默认输入框文字样式
        //DialogX.inputInfo = (InputInfo);

        //设置默认底部菜单、对话框的标题文字样式
        //DialogX.menuTitleInfo = (TextInfo);

        //设置默认底部菜单文本样式
        //DialogX.menuTextInfo = (TextInfo);

        //设置默认对话框背景颜色（值为ColorInt，为-1不生效）
        DialogX.backgroundColor = Color.WHITE;

        //设置默认对话框默认是否可以点击外围遮罩区域或返回键关闭，此开关不影响提示框（TipDialog）以及等待框（TipDialog）
        DialogX.cancelable = false;

        //设置默认提示框及等待框（WaitDialog、TipDialog）默认是否可以关闭
        DialogX.cancelableTipDialog = false;

        //设置默认取消按钮文本文字，影响 BottomDialog
        //DialogX.cancelButtonText = (String);

        //设置默认 PopTip 文本样式
        //DialogX.popTextInfo = (TextInfo);

        //设置全局 Dialog 生命周期监听器
        //DialogX.dialogLifeCycleListener = (DialogLifecycleCallback);

        //设置 TipDialog 和 WaitDialog 明暗风格，不设置则默认根据 globalTheme 定义
        //DialogX.tipTheme = (THEME);

        //默认 TipDialog 和 WaitDialog 背景颜色（值为 ColorInt，为-1不生效）
        //DialogX.tipBackgroundColor = (ColorInt)

        /**
         * 重写 TipDialog 和 WaitDialog 进度动画颜色，
         * 注意此属性为覆盖性质，即设置此值将替换提示框原本的进度动画的颜色，包括亮暗色切换的颜色变化也将被替代
         * （值为 ColorInt，为-1不生效）
         */
        //DialogX.tipProgressColor = (ColorInt)

        CustomDialog.overrideMaskEnterAnimRes = 0;
        CustomDialog.overrideMaskExitAnimRes = 0;
    }



    private void initBackgroundCallBack() {
        mApplication.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                appCount++;
                LogUtils.e("------应用在---started--" + appCount);
                if (isRunInBackground) {
                    //应用从后台回到前台 需要做的操作
                    back2App(activity);
                }

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                appCount--;
                LogUtils.e("------应用在---stopped--" + appCount);
                if (appCount == 0) {
                    //应用进入后台 需要做的操作
                    leaveApp(activity);
                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

    /**
     * 从后台回到前台需要执行的逻辑
     *
     * @param activity
     */
    private void back2App(Activity activity) {
        isRunInBackground = false;
        LogUtils.e("------应用在--前台");
    }

    /**
     * 离开应用 压入后台或者退出应用
     *
     * @param activity
     */
    private void leaveApp(Activity activity) {
        isRunInBackground = true;
        LogUtils.e("------应用在--后台");
    }


}
